package com.gxa.common.utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;

public class EasyExcelUtils<T> {

    private Class<T> clazz;

    public EasyExcelUtils(Class<T> clazz) {
        this.clazz = clazz;
    }


    /**
     * 将数据导出成 excel表格
     * @param request   request
     * @param response  response
     * @param fileName  导出excel的文件名字
     * @param dataList  需要导出的数据
     * @throws Exception
     */
    public void exportToExcel(HttpServletRequest request, HttpServletResponse response, String fileName, List<T> dataList) throws Exception {
        //1.设置response响应头
        response.reset(); //设置页面不缓存,清空buffer
        response.setCharacterEncoding("UTF-8"); //字符编码
        response.setContentType("multipart/form-data"); //二进制传输数据
        //防止中文文件名乱码
        String encode = URLEncoder.encode(fileName, "UTF-8");
        String encodeFileName = encode + ".xlsx";
        //设置文件下载头
        response.setHeader("Content-Disposition",
                "attachment;fileName=" + encodeFileName);

        //2.创建工作薄
        ExcelWriterBuilder workBook = EasyExcel.write(
                response.getOutputStream(), clazz);
        // 创建一个工作表sheet方法参数： 工作表的顺序号（从0开始）或者工作表的名字
        workBook.sheet().doWrite(dataList);
    }

    /**
     * 缺点 Excel中的顺序要和类对象顺序一致才能对应
     * 将excel表单数据源的数据导入到list  单个sheet
     *
     * @param sheetIndex 工作表的位置
     * @param headRowNumber 读取几行表头
     * @param file       文件
     * @throws Exception
     */
    public List<T> getExcelToList(Integer sheetIndex, Integer headRowNumber , MultipartFile file) throws Exception {
        //1.判断文件类型是否正确
        if (file == null)
            System.out.println("文件不能为空");
        String name = file.getOriginalFilename();
        if (!name.endsWith(".xls") && !name.endsWith(".xlsx"))
            System.out.println("请上传xsl或xlsx格式文件");
        //2.获取文件流
        InputStream inputStream = file.getInputStream();
        List<T> list = (List<T>) EasyExcel.read(inputStream).head(clazz).sheet(sheetIndex).headRowNumber(headRowNumber).doReadSync();
        return list;
    }
}
